package com.boil.qz.safekavass.weixin.controller;

import com.boil.qz.safekavass.weixin.service.AccessService;
import com.boil.qz.safekavass.weixin.util.WeixinUtils;
import com.boil.util.BaseController;
import com.boil.util.Constants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * Created by ChenYong on 2017-04-27.
 * <br>
 * 微信接入 Controller。
 */
@Controller
@RequestMapping("/weixin")
public class AccessController extends BaseController {
    /**
     * 注入微信 Service
     */
    @Autowired
    private AccessService accessService;

    /**
     * 给微信调用的 GET 请求。
     * <br>
     * <p style="color: red;">
     * 注意：此接口用于微信接入。
     * </p>
     *
     * @param signature 微信加密签名，signature 结合了开发者填写的 token 参数和请求中的 timestamp 参数、nonce 参数
     * @param timestamp 时间戳
     * @param nonce     随机数
     * @param echostr   随机字符串
     * @return <ol>
     * <li>接入成功，原样返回 echostr；</li>
     * <li>接入失败，返回“false”字符串；</li>
     * </ol>
     */
    @RequestMapping(method = RequestMethod.GET, value = "/access.html")
    @ResponseBody
    public String accessGet(String signature, String timestamp, String nonce, String echostr) {
        if (WeixinUtils.checkSignature(signature, WeixinUtils.TOKEN, timestamp, nonce)) {
            log.info("微信接入成功--->参数：signature[{}]，token[{}]，timestamp[{}]，nonce[{}], 本地signature[{}]", signature, WeixinUtils.TOKEN, timestamp, nonce, WeixinUtils.getSignature(WeixinUtils.TOKEN, timestamp, nonce));

            return echostr;
        }

        log.info("微信接入失败--->参数：signature[{}]，token[{}]，timestamp[{}]，nonce[{}], 本地signature[{}]", signature, WeixinUtils.TOKEN, timestamp, nonce, WeixinUtils.getSignature(WeixinUtils.TOKEN, timestamp, nonce));

        return Constants.FALSE;
    }

    /**
     * 给微信调用的 POST 请求。
     * <br>
     * <p style="color: red;">
     * 注意：此接口用于接收微信消息和事件。
     * </p>
     *
     * @return
     */
    @RequestMapping(method = RequestMethod.POST, value = "/access.html")
    @ResponseBody
    public String accessPost() {
        String replyMsg = accessService.doAccess(request);

        return replyMsg;
    }
}